package com.the_ring.chapter14.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Environment;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class MediaUtil {

    public static Bitmap getOneFrame(Context ctx, Uri uri) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(ctx, uri);
        // 获得视频的播放时长，大于 1s 的取第 1s 处的帧图，不足 1s 的取第 0s 处的帧图
        String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
        int pos = (Integer.parseInt(duration) / 1000) > 1 ? 1 : 0;
        // 获取并返回指定时间的帧图
        return retriever.getFrameAtTime(pos * 1000, MediaMetadataRetriever.OPTION_CLOSEST);
    }

    /**
     * 获取视频文件中的某帧图片，
     * @param ctx
     * @param uri
     * @param pos 毫秒时间
     * @return
     */
    public static Bitmap getOneFrame(Context ctx, Uri uri, int pos) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(ctx, uri);
        return retriever.getFrameAtTime(pos * 1000);
    }

    /**
     * 获取视频文件中的图片帧列表
     * @param ctx
     * @param uri
     * @param beginPos 毫秒时间
     * @param count 获取的帧数量
     * @return
     */
    public static List<String> getFrameList(Context ctx, Uri uri, int beginPos, int count) {
        String videoPath = uri.toString();
        String videoName = videoPath.substring(videoPath.lastIndexOf("/") + 1);
        if (videoName.contains(".")) {
            videoName = videoName.substring(0, videoName.lastIndexOf("."));
        }
        List<String> pathList = new ArrayList<>();
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        retriever.setDataSource(ctx, uri);
        // 获得视频的播放时长
        String duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
        int durationInt = Integer.parseInt(duration) / 1000;
        // 最多只取前多少帧
        for (int i = 0; i < durationInt - beginPos / 1000 && i < count; i++) {
            String path = String.format("%s/%s_%d.jpg",
                    ctx.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),
                    videoName,
                    i);
            if (beginPos != 0 || !(new File(path).exists())) {
                // 获取指定时间的帧图，注意 getFrameAtTime 方法的时间单位为毫秒
                Bitmap frame = retriever.getFrameAtTime(beginPos * 1000 + i * 1000 * 1000);
                int ratio = frame.getWidth() / 100 + 1;
//                Bitmap small = BitmapUtil.getScaleBitmap(frame, 1.0 / ratio);
//                BitmapUtil.saveImage(path, small);  // 把位图保存为图像文件
            }
            pathList.add(path);
        }
        return pathList;
    }
}
